home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 10.st / info_src.arc / OUT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-02-01  |  21.7 KB  |  622 lines

  1. {InfoBaseST by James W. Maki (c) Copyright 1990 by Antic Publishing, Inc.}
  2. {$M+}
  3. {$E+}
  4.  
  5. Program Output_Module;
  6.  
  7.       {$I A:GEMSUBS.PAS }
  8.       {$I A:AUXSUBS.PAS }
  9.  
  10.  Const
  11.       {$I B:MOD_CONS.PAS }
  12.  
  13.  Type
  14.       {$I B:MOD_TYPE.PAS }
  15.  
  16.  Var
  17.       {$I B:MOD_VAR.PAS }
  18.  
  19. {  ******************************  External ***************************** }
  20.   procedure GetStr(CurRec   : DataPtr ; Var DisplayStr : Str255 ;
  21.                    StartPos, Size : short_integer ) ;
  22.      External ;
  23.  
  24.   procedure AddARec(Var FirstRec, CurRec, LastRec, ScrRec : ScrPtr ;
  25.                         TitleStr : Str255 ;
  26.                         XCur, YCur, Size : short_integer ;
  27.                         DataType : char ; ScrNum : short_integer) ;
  28.      External ;
  29.  
  30.   procedure DisposeRecs(Var FirstRec, CurRec, LastRec : ScrPtr ) ;
  31.      External ;
  32.  
  33.   procedure IncrementRec(Var  CurRec : DataPtr ; Value : short_integer ;
  34.                               DrawFlag : boolean ) ;
  35.      External ;
  36. { ********************************  Output  ***************************** }
  37.  
  38.   procedure FormatOutput ;
  39.  
  40.     var
  41.        i, j, 
  42.        ScrOffset,
  43.        LastLetter : short_integer ;
  44.        ScrRec    : ScrPtr ;
  45.        ScrRecI   : ScrPtr ;
  46.        DataRec   : DataPtr ;
  47.        CheckChar : char ;
  48.        CollectStr: Str255 ;
  49.   
  50.      begin
  51.        ScrRec := S_FirstRec[Report] ;
  52.        DataRec := D_FirstRec[Report] ;
  53.        While ScrRec <> nil do
  54.           begin
  55.             GetStr(DataRec, FormatStr, ScrRec^.Offset, ScrRec^.Size ) ;
  56.             CollectStr := '' ;
  57.  
  58.             for j := 1 to RepWidth do
  59.                 if FormatStr[j] <> chr($20) then
  60.                    LastLetter := j ;
  61.  
  62.             for j := 1 to LastLetter do
  63.                 begin
  64.                   CheckChar := FormatStr[j] ;
  65.                   if ord(CheckChar) > $7F then
  66.                      begin
  67.                        AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  68.                                S_LastRec[Import], S_LastRec[Import], 
  69.                                CollectStr, 0, 0, 1, 'A', Import) ;
  70.                        CollectStr := '' ;
  71.  
  72.                        ScrOffset := ord(CheckChar) - $7F ;
  73.                        ScrRecI := S_FirstRec[ScrNum] ;
  74.                        for i := 2 to ScrOffset do
  75.                            ScrRecI := ScrRecI^.Next ;
  76.                        j := j + ScrRecI^.Size - 1 ;
  77.                                                   
  78.                        AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  79.                                S_LastRec[Import], S_LastRec[Import], 
  80.                                '', ScrOffset, 0, 1, 'A', Import) ;
  81.                      end 
  82.                   else
  83.                   
  84.                      if ord(CheckChar) = $40 then
  85.                         begin
  86.                           AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  87.                                   S_LastRec[Import], S_LastRec[Import], 
  88.                                   CollectStr, 0, 0, 1, 'A', Import) ;
  89.                           CollectStr := CheckChar ;
  90.                         end
  91.                      else
  92.                      
  93.                      begin
  94.                        CollectStr := Concat(CollectStr, CheckChar) ;
  95.                        if Length(CollectStr) > 19 then
  96.                           begin
  97.                             AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  98.                                     S_LastRec[Import], S_LastRec[Import], 
  99.                                     CollectStr, 0, 0, 1, 'A', Import) ;
  100.                             CollectStr := '' ;
  101.                           end ;
  102.                      end ;          
  103.                 end ;
  104.             if Length(CollectStr) > 0 then
  105.                AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  106.                        S_LastRec[Import], S_LastRec[Import], 
  107.                        CollectStr, 0, 0, 1, 'A', Import) ;
  108.  
  109.             ScrRec := ScrRec^.Next ;
  110.             AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  111.                     S_LastRec[Import], S_LastRec[Import], 
  112.                     '', 0, 1, 1, 'A', Import) ;
  113.           end ;
  114.      end ;
  115.  
  116.   procedure FormatOutput1( Var Start, Count : short_integer) ;
  117.  
  118.     var
  119.        i, j, k,
  120.        ScrOffset,
  121.        LastLetter : short_integer ;
  122.        ScrRec    : ScrPtr ;
  123.        ScrRecI   : ScrPtr ;
  124.        DataRec   : DataPtr ;
  125.        CheckChar : char ;
  126.        CollectStr: Str255 ;
  127.        BlankFlag : boolean ;
  128.        
  129.  
  130.      begin
  131.        Case RepLine of
  132.            1 : begin
  133.                  Start := 5 ;  { 4 }
  134.                  Count := 1 ;
  135.                end ;
  136.            2 : begin
  137.                  Start := 5 ;  { 4 }
  138.                  Count := 2 ;
  139.                end ;
  140.            3 : begin
  141.                  Start := 5 ;  { 4 }
  142.                  Count := 3 ;
  143.                end ;
  144.            4 : begin
  145.                  Start := 4 ;  { 3 }
  146.                  Count := 4 ;
  147.                end ;
  148.        end ;
  149.        
  150.        ScrRec := S_FirstRec[Report] ;
  151.        for i := 1 to Start do
  152.            ScrRec := ScrRec^.Next ;
  153.        DataRec := D_FirstRec[Report] ;
  154.        for i := 1 to Count do
  155.           begin
  156.             GetStr(DataRec, FormatStr, ScrRec^.Offset, ScrRec^.Size ) ;
  157.             BlankFlag := false ;
  158.             for j := 1 to RepWidth do
  159.                 if FormatStr[j] <> chr($20) then
  160.                    begin
  161.                      BlankFlag := true ;
  162.                      LastLetter := j ;
  163.                    end ;
  164.             CollectStr := '' ;
  165.             if BlankFlag then
  166.                for j := 1 to LastLetter do
  167.                    begin
  168.                      CheckChar := FormatStr[j] ;
  169.                      if ord(CheckChar) > $7F then
  170.                         begin
  171.                           if Length(CollectStr) > 0 then
  172.                             begin
  173.                              AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  174.                                      S_LastRec[Import], S_LastRec[Import], 
  175.                                      CollectStr, 0, 0, 1, 'A', Import) ;
  176.                              CollectStr := '' ;
  177.                             end ;
  178.  
  179.                           ScrOffset := ord(CheckChar) - $7F ;
  180.                           ScrRecI := S_FirstRec[ScrNum] ;
  181.                           k := 2 ;
  182.                           while (k <= ScrOffset) AND (ScrRecI <> nil) do
  183.                              begin
  184.                                ScrRecI := ScrRecI^.Next ;
  185.                                k := k + 1 ;
  186.                              end ;
  187.                           if ScrRecI <> nil then
  188.                              begin
  189.                                j := j + ScrRecI^.Size - 1 ;
  190.                                AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  191.                                        S_LastRec[Import], S_LastRec[Import], 
  192.                                        '', ScrOffset, 0, 1, 'A', Import) ;
  193.                              end
  194.                           else
  195.                              begin
  196.                                CollectStr := Concat(CollectStr, ' ') ;
  197.                                j := j + 1 ;
  198.                              end ;
  199.                         end 
  200.                      else
  201.                   
  202.                      if ord(CheckChar) = $40 then
  203.                         begin
  204.                           AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  205.                                   S_LastRec[Import], S_LastRec[Import], 
  206.                                   CollectStr, 0, 0, 1, 'A', Import) ;
  207.                           CollectStr := CheckChar ;
  208.                         end
  209.                      else
  210.                      
  211.                         begin
  212.                           CollectStr := Concat(CollectStr, CheckChar) ;
  213.                           if Length(CollectStr) > 19 then
  214.                              begin
  215.                                AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  216.                                        S_LastRec[Import], S_LastRec[Import], 
  217.                                        CollectStr, 0, 0, 1, 'A', Import) ;
  218.                                CollectStr := '' ;
  219.                              end ;
  220.                         end ;          
  221.                    end ;
  222.             if Length(CollectStr) > 0 then
  223.                AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  224.                        S_LastRec[Import], S_LastRec[Import], 
  225.                        CollectStr, 0, 0, 1, 'A', Import) ;
  226.             ScrRec := ScrRec^.Next ;
  227.             if BlankFlag then
  228.                AddARec(S_FirstRec[Import], S_CurrentRec[Import],
  229.                        S_LastRec[Import], S_LastRec[Import], 
  230.                        '', 0, 1, 1, 'A', Import) ;
  231.           end ;
  232.      end ;
  233.  
  234.  
  235.   procedure PrintARec(DataRec : DataPtr ; 
  236.                       Var LineNo, PageNo, RecNo : short_integer) ;
  237.   
  238.     var
  239.        CurRec,
  240.        ScrRec : ScrPtr ;
  241.  
  242.        i, j,
  243.        CommandPos : short_integer ;
  244.        PrintStr,
  245.        CommandStr : Str255 ;
  246.        ComStr     : array[1..2] of Str255 ;
  247.        Month,
  248.        Day,
  249.        Year       : short_integer ;
  250.  
  251.        Start,
  252.        Count      : short_integer ;
  253.        NoSpace    : boolean ;
  254.        
  255.        StopValue  : short_integer ;
  256.  
  257.      begin
  258.        for i := 1 to LabSpace[1] do
  259.            Writeln(Printer) ;
  260.        ScrRec := S_FirstRec[Import] ;
  261.        NoSpace := false ;
  262.        LineNo := 1 ;
  263.        While ScrRec <> nil do
  264.          begin
  265.            PrintStr := ScrRec^.LabelStr ;
  266.            if ScrRec^.X <> 0 then
  267.               begin
  268.                 CurRec := S_FirstRec[ScrNum] ;
  269.                 for i := 2 to ScrRec^.X do
  270.                     CurRec := CurRec^.Next ;
  271.                 GetStr(DataRec, FormatStr, CurRec^.Offset, CurRec^.Size ) ;
  272.                 Write(Printer, FormatStr) ;
  273.                 if NOT NoSpace then
  274.                    begin
  275.                      for i := Length(FormatStr) to CurRec^.Size - 1 do
  276.                          Write(Printer, ' ') ;
  277.                    end ;
  278.               end
  279.            else
  280.               if ScrRec^.Y <> 0 then
  281.                  begin
  282.                    Writeln(Printer) ;
  283.                    LineNo := LineNo + 1 ;
  284.                    if LineNo > LabLine then
  285.                       ScrRec := nil ;
  286.                  end 
  287.               else
  288.                  repeat
  289.                    CommandPos := Pos('@', PrintStr) ;
  290.                    if CommandPos > 0 then
  291.                       begin
  292.                         CommandStr := Copy(PrintStr, 
  293.                                            CommandPos + 1, 4) ; 
  294.                         ComStr[1]  := Copy(PrintStr, 1, 
  295.                                            CommandPos - 1) ;
  296.                         ComStr[2]  := Copy(PrintStr, 
  297.                                            CommandPos + 5, 
  298.                                            Length(PrintStr) 
  299.                                                   - CommandPos + 5) ;
  300.                         Write(Printer, ComStr[1]) ;
  301.                         if CommandStr = 'Page' then
  302.                            Write(Printer, PageNo:5)
  303.                         else
  304.  
  305.                         if CommandStr = 'Line' then
  306.                            Write(Printer, LineNo:5)
  307.                         else
  308.                            if CommandStr = 'Date' then
  309.                               begin
  310.                                 Get_Date(Month,Day,Year) ;
  311.                                 WriteV(FormatStr, Month,'/',Day,'/', Year) ;
  312.                                 for j := 1 to (10 - Length(FormatStr)) DIV 2 do
  313.                                     Write(Printer, chr($20)) ;
  314.                                 Write(Printer, FormatStr) ;
  315.                              end
  316.                           else
  317.                              if CommandStr = 'Rec#' then
  318.                                 Write(Printer, RecNo:5)
  319.                              else
  320.                                 if CommandStr = 'Null' then
  321.                                    NoSpace := true
  322.                                 else
  323.                                    Write(Printer, '    ') ;
  324.                         PrintStr := ComStr[2] ;
  325.                       end
  326.                    else
  327.                       begin
  328.                         Write(Printer, PrintStr) ;
  329.                         PrintStr := '' ;
  330.                       end ;
  331.                  Until Length(PrintStr) < 1 ;
  332.  
  333.            if ScrRec <> nil then
  334.               ScrRec := ScrRec^.Next ;
  335.          end ;
  336.        for i := 1 to LabSpace[2] do
  337.            Writeln(Printer) ;
  338.      end ;
  339.  
  340.   procedure PrintRec(DataRec : DataPtr ) ;
  341.  
  342.     var
  343.        LineNo,
  344.        PageNo,
  345.        RecNo  : short_integer ;
  346.  
  347.      begin
  348.        LineNo := 1 ;
  349.        PageNo := 1 ;
  350.        RecNo  := 1 ;
  351.        FormatOutput ;
  352.        PrintARec(DataRec, LineNo, PageNo, RecNo) ;
  353.        DisposeRecs(S_FirstRec[Import], S_CurrentRec[Import],
  354.                    S_LastRec[Import]) ;
  355.      end ;
  356.  
  357.   procedure M_PrintRec ;
  358.  
  359.     var
  360.        i       : short_integer ;
  361.        DataRec : DataPtr ;
  362.        LineNo,
  363.        PageNo,
  364.        RecNum     : short_integer ;
  365.        SaveIntPtr : IntPtr ;
  366.        SaveRecNo  : short_integer ;
  367.        SaveFRecNo : short_integer ;
  368.  
  369.      begin
  370.        LineNo := 1 ;
  371.        PageNo := 1 ;
  372.        RecNum := 1 ;
  373.        FormatOutput ;
  374.        SaveIntPtr := F_CurRec ;
  375.        F_CurRec := F_FirstRec ;
  376.        SaveFRecNo := F_RecNo[DataNum] ;
  377.        SaveRecNo  := RecNo[DataNum] ;
  378.        DataRec := D_FirstRec[DataNum] ;
  379.        if F_FirstRec <> nil then
  380.           for i := 2 to F_FirstRec^.Match do
  381.               DataRec := DataRec^.Next ;
  382.  
  383.        While DataRec <> nil do
  384.          begin
  385.            PrintARec(DataRec, LineNo, PageNo, RecNum) ;
  386.            IncrementRec(DataRec, 1, true) ;
  387.            PageNo := PageNo + 1 ;
  388.            RecNum := RecNum + 1 ;
  389.          end ;
  390.  
  391.        DisposeRecs(S_FirstRec[Import], S_CurrentRec[Import],
  392.                    S_LastRec[Import]) ;
  393.        F_CurRec := SaveIntPtr ;
  394.        F_RecNo[DataNum] := SaveFRecNo ;
  395.        RecNo[DataNum]   := SaveRecNo ;
  396.      end ;
  397.  
  398.   procedure PrintReport ;
  399.   
  400.     var
  401.        DataRec    : DataPtr ;
  402.        ScrRec,
  403.        CurRec     : ScrPtr ;
  404.        i, j,
  405.        LineNo,
  406.        PageNo,
  407.        RecNum,
  408.        CommandPos : short_integer ;
  409.        PrintStr,
  410.        CommandStr : Str255 ;
  411.        ComStr     : array[1..2] of Str255 ;
  412.        Month,
  413.        Day,
  414.        Year       : short_integer ;
  415.        SaveIntPtr : IntPtr ;
  416.        SaveRecNo  : short_integer ;
  417.        SaveFRecNo : short_integer ;
  418.  
  419.        Start,
  420.        Count      : short_integer ;
  421.        NoSpace    : boolean ;
  422.        
  423.        StopValue  : short_integer ;
  424.  
  425.      procedure CommandLine(ModStr : Str255) ;
  426.      
  427.        var
  428.           j : short_integer ;
  429.           
  430.         begin
  431.          repeat
  432.           CommandPos := Pos('@', ModStr) ;
  433.           if CommandPos > 0 then
  434.              begin
  435.                CommandStr := Copy(ModStr, CommandPos + 1, 4) ;
  436.                ComStr[1] := Copy(ModStr, 1, CommandPos - 1) ;
  437.                ComStr[2] := Copy(ModStr, CommandPos + 5, 
  438.                                  Length(ModStr) - CommandPos + 5) ;
  439.                Write(Printer, ComStr[1]) ;
  440.                if CommandStr = 'Page' then
  441.                   Write(Printer, PageNo:5)
  442.                else
  443.                   if CommandStr = 'Date' then
  444.                      begin
  445.                        Get_Date(Month,Day,Year) ;
  446.                        WriteV(ModStr, Month,'/',Day,'/', Year) ;
  447.                        for j := 1 to (10 - Length(ModStr)) DIV 2 do
  448.                            Write(Printer, chr($20)) ;
  449.                        Write(Printer, ModStr) ;
  450.                        Delete(ComStr[2], Length(ComStr[2]) - 5, 5) ;
  451.                      end
  452.                   else
  453.                      if CommandStr = 'Line' then
  454.                         Write(Printer, LineNo + (PageNo - 1) * 54:5)
  455.                      else
  456.                         if CommandStr = 'Rec#' then
  457.                            Write(Printer, RecNum:5)
  458.                         else
  459.                            Write(Printer, '    ') ;
  460.                ModStr := ComStr[2] ;
  461.              end 
  462.           else
  463.              begin
  464.                Writeln(Printer, ModStr) ;
  465.                ModStr := '' ;
  466.              end ;
  467.          Until Length(ModStr) < 1 ;
  468.         end ;
  469.  
  470.      procedure PageTop ;
  471.  
  472.        var
  473.           i, j    : short_integer ;
  474.           CurRec  : ScrPtr ;
  475.           DataRec : DataPtr ;
  476.  
  477.         begin
  478.           for i := 1 to 2 do
  479.               Writeln(Printer) ;
  480.           CurRec := S_FirstRec[Report] ;
  481.           DataRec := D_FirstRec[Report] ;
  482.           for i := 1 to Start do
  483.               begin
  484.                 GetStr(DataRec, FormatStr, CurRec^.Offset, CurRec^.Size ) ;
  485.                 if RepWidth = 80 then
  486.                    Delete(FormatStr, 78, 54) ;
  487.                 CommandLine(FormatStr) ;
  488.                 CurRec := CurRec^.Next ;
  489.               end ;
  490.         end ;
  491.  
  492.      procedure PageBottom ;
  493.  
  494.        var
  495.           i, j    : short_integer ;
  496.           CurRec  : ScrPtr ;
  497.           DataRec : DataPtr ;
  498.  
  499.         begin
  500.           CurRec := S_FirstRec[Report] ;
  501.           for i := 1 to Start + Count do
  502.               CurRec := CurRec^.Next ;
  503.           DataRec := D_FirstRec[Report] ;
  504.           for i := 1 to (10 - Count - Start) do
  505.               begin
  506.                 GetStr(DataRec, FormatStr, CurRec^.Offset, CurRec^.Size ) ;
  507.                 if RepWidth = 80 then
  508.                    Delete(FormatStr, 78, 54) ;
  509.                 CommandLine(FormatStr) ;
  510.                 CurRec := CurRec^.Next ;
  511.               end ;
  512.           for i := 1 to 2 do
  513.               Writeln(Printer) ;
  514.         end ;
  515.  
  516.  
  517.      begin
  518.        FormatOutput1(Start, Count) ;
  519.        SaveIntPtr := F_CurRec ;
  520.        SaveFRecNo := F_RecNo[DataNum] ;
  521.        SaveRecNo  := RecNo[DataNum] ;
  522.        DataRec := D_FirstRec[DataNum] ;
  523.        F_CurRec := F_FirstRec ;
  524.        if F_FirstRec <> nil then
  525.           for i := 2 to F_FirstRec^.Match do
  526.               DataRec := DataRec^.Next ;
  527.        LineNo := 1 ;
  528.        PageNo := 1 ;
  529.        RecNum := 1 ;
  530.        PageTop ;
  531.        While DataRec <> nil do
  532.           begin
  533.             ScrRec := S_FirstRec[Import] ;
  534.             NoSpace := false ;
  535.             While ScrRec <> nil do
  536.                begin
  537.                  PrintStr := ScrRec^.LabelStr ;
  538.                  if ScrRec^.X <> 0 then
  539.                     begin
  540.                       CurRec := S_FirstRec[ScrNum] ;
  541.                       for i := 2 to ScrRec^.X do
  542.                           CurRec := CurRec^.Next ;
  543.                       GetStr(DataRec, FormatStr, 
  544.                              CurRec^.Offset, CurRec^.Size ) ;
  545.                       Write(Printer, FormatStr) ;
  546.                       if NOT NoSpace then
  547.                          for i := Length(FormatStr) to CurRec^.Size - 1 do
  548.                              Write(Printer, ' ') ;
  549.                     end
  550.                  else
  551.                     if ScrRec^.Y <> 0 then
  552.                        begin
  553.                          Writeln(Printer) ;
  554.                          LineNo := LineNo + 1 ;
  555.                          if ((LineNo > 54) AND (RepLine < 4)) OR
  556.                             ((LineNo > 56) AND (RepLine = 4)) then
  557.                             begin
  558.                               PageBottom ;
  559.                               PageNo := PageNo + 1 ;
  560.                               PageTop ;
  561.                               LineNo := 1 ;
  562.                             end ;
  563.                        end 
  564.                     else
  565.                        repeat
  566.                          CommandPos := Pos('@', PrintStr) ;
  567.                          if CommandPos > 0 then
  568.                             begin
  569.                               CommandStr := Copy(PrintStr, 
  570.                                                  CommandPos + 1, 4) ; 
  571.                               ComStr[1]  := Copy(PrintStr, 1, 
  572.                                                  CommandPos - 1) ;
  573.                               ComStr[2]  := Copy(PrintStr, 
  574.                                                  CommandPos + 5, 
  575.                                                  Length(PrintStr) 
  576.                                                         - CommandPos + 5) ;
  577.                               if CommandStr = 'Line' then
  578.                                  Write(Printer, LineNo + (PageNo - 1) * 54:5)
  579.                               else
  580.                                  if CommandStr = 'Rec#' then
  581.                                     Write(Printer, RecNum:5)
  582.                                  else
  583.                                     if CommandStr = 'Null' then
  584.                                        NoSpace := true
  585.                                     else
  586.                                        Write(Printer, '    ') ;
  587.                               PrintStr := ComStr[2] ;
  588.                             end
  589.                          else
  590.                             begin
  591.                               Write(Printer, PrintStr) ;
  592.                               PrintStr := '' ;
  593.                             end ;
  594.                        Until Length(PrintStr) < 1 ;
  595.                  ScrRec := ScrRec^.Next ;
  596.               end ;
  597.             IncrementRec(DataRec, 1, true) ;
  598.             RecNum:= RecNum+ 1 ;
  599.           end ;
  600.  
  601.        Case RepLine of
  602.           1 : j := 54 ;
  603.           2 : j := 54 ;
  604.           3 : j := 55 ;
  605.           4 : j := 56 ;
  606.        end ;
  607.  
  608.        for i := LineNo to j do
  609.            Writeln(Printer) ;
  610.        PageBottom ;
  611.        DisposeRecs(S_FirstRec[Import], S_CurrentRec[Import], 
  612.                    S_LastRec[Import]) ;
  613.        F_CurRec := SaveIntPtr ;
  614.        F_RecNo[DataNum] := SaveFRecNo  ;
  615.        RecNo[DataNum] := SaveRecNo  ;
  616.      end ;
  617.  
  618.  
  619. BEGIN
  620. END .
  621.  
  622.